package com.fanrenqiji.common.persistence;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.transform.ResultTransformer;

import javax.persistence.EntityManager;
import java.sql.SQLException;
import java.util.List;

/**
 * DAO支持接口,对hibernate和JPA的整合 对公共的对数据操作的接口
 * jpa具体查看 http://ljz0721cx.iteye.com/blog/2183434
 * 
 * @author lijian E-mail:ljz0721cx@163.com
 * @version 2015-01-14
 * @param <T>
 */
public interface BaseDao<T> {
	/**
	 * 获得实体管理的工厂
	 * 
	 * @return 实体工厂
	 */
	public EntityManager getEntityManager();

	/**
	 * 获得hibernate的数据操作会话
	 * 
	 * @return 当前会话
	 */
	public Session getSession();

	/**
	 * 同步缓存中的数据到数据库
	 */
	public void flush();

	/**
	 * 清除缓存数据
	 */
	public void clear();

	/**
	 * 通过参数查询对应的分页对象
	 * 
	 * @param page
	 * @param qlString
	 * @param parameter
	 * @return 返回需要的分页数据
	 */
	public <E> Page<E> find(Page<E> page, String qlString, Object... parameter);

	/**
	 * 通过参数查询对应的列表数据
	 * 
	 * @param qlString
	 * @param parameter
	 * @return 返回对应的列表数据
	 */
	public <E> List<E> find(String qlString, Object... parameter);

	/**
	 * 通过参数跟新数据
	 * 
	 * @param qlString
	 * @param parameter
	 * @return 返回更新的条数
	 */
	public int update(String qlString, Object... parameter) throws Exception;

	/**
	 * 创建简单查询对象
	 * 
	 * @param qlString
	 * @param parameter
	 * @return 创建简单的hibernate查询对象
	 */
	public Query createQuery(String qlString, Object... parameter);

	/**
	 * SQL分页查询
	 * 
	 * @param page
	 * @param sqlString
	 * @param parameter
	 * @return
	 */
	public <E> Page<E> findPageBySql(Page<E> page, String sqlString,
                                     Object... parameter);

	/**
	 * SQL分页查询
	 *
	 * @param page
	 *            分页对象
	 * @param sqlString
	 * @param resultClass
	 *            查询到的数据对象类型
	 * @param parameter
	 * @return
	 */
	public <E> Page<E> findPageBySql(Page<E> page, String sqlString,
                                     Class<?> resultClass, Object... parameter);

	/**
	 * SQL查询
	 *
	 * @param sqlString
	 * @param parameter
	 * @return
	 */
	public <E> List<E> findBySql(String sqlString, Object... parameter);

	/**
	 * SQL查询
	 *
	 * @param sqlString
	 * @param resultClass
	 * @param parameter
	 * @return
	 */
	public <E> List<E> findBySql(String sqlString, Class<?> resultClass,
                                 Object... parameter);

	/**
	 * SQL更新
	 *
	 * @param sqlString
	 * @param parameter
	 * @return
	 */
	public int updateBySql(String sqlString, Object... parameter) throws SQLException;

	/**
	 * 创建sql查询对象
	 *
	 * @param sqlString
	 * @param parameter
	 * @return
	 */
	public Query createSqlQuery(String sqlString, Object... parameter);

	// -------------- Criteria --------------

	/**
	 * 分页查询
	 *
	 * @param page
	 * @return
	 */
	public Page<T> find(Page<T> page);

	/**
	 * 使用检索标准对象分页查询
	 *
	 * @param page
	 * @param detachedCriteria
	 * @return
	 */
	public Page<T> find(Page<T> page, DetachedCriteria detachedCriteria);

	/**
	 * 使用检索标准对象分页查询
	 *
	 * @param page
	 * @param detachedCriteria
	 * @param resultTransformer
	 * @return
	 */
	public Page<T> find(Page<T> page, DetachedCriteria detachedCriteria,
                        ResultTransformer resultTransformer);

	/**
	 * 使用检索标准对象查询
	 *
	 * @param detachedCriteria
	 * @return
	 */
	public List<T> find(DetachedCriteria detachedCriteria);

	/**
	 * 使用检索标准对象查询
	 *
	 * @param detachedCriteria
	 * @param resultTransformer
	 * @return
	 */
	public List<T> find(DetachedCriteria detachedCriteria,
                        ResultTransformer resultTransformer);

	/**
	 * 使用检索标准对象查询记录数
	 * 
	 * @param detachedCriteria
	 * @return
	 */
	public long count(DetachedCriteria detachedCriteria);

	/**
	 * 创建与会话无关的检索标准对象
	 * 
	 * @param criterions
	 *            Restrictions.eq("name", value);
	 * @return
	 */
	public DetachedCriteria createDetachedCriteria(Criterion... criterions);


}
